package com.gongj.fshe.utils;

import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Objects;

@Slf4j
public class CheckUtil {

    /**
     * @param sourceObject 源对象
     * @param checkFields 需要效验的字段集合
     * @param sourceObject
     * @param checkFields
     * @return
     */
//    public static String checkObjNull(Object sourceObject, List<String> checkFields){
//        if(Objects.isNull(sourceObject)){
//            return "请输入正确源对象";
//        }
//        if(CollectionUtils.isEmpty(checkFields)){
//            return "效验字段不能为空";
//        }
//        Class<?> objClass = sourceObject.getClass();
//        // 获得本类所有属性对象
//        Field[] declaredFields = objClass.getDeclaredFields();
//        if(null == declaredFields || declaredFields.length == 0){
//            return "源对象中没有属性";
//        }
//
//        StringBuilder sb = new StringBuilder();
//        for (String checkField : checkFields) {
//            for (Field field : declaredFields) {
//                //关闭程序的安全检测
//                field.setAccessible(true);
//                // 效验字段与 属性名称相等 则进行效验
//                String fieldName = field.getName();
//                if(checkField.equals(fieldName)){
//                    try {
//                        // 获得字段属性值
//                        Object fieldValue = field.get(sourceObject);
//                        // 如果字段属性值为 null 或者 “” 字符串 则认为该字段没有传值
//                        if(Objects.isNull(fieldValue) || StringUtils.isEmpty(fieldValue.toString())){
//                            sb = sb.append("[").
//                                    append(fieldName).
//                                    append("]").
//                                    append("为必传字段");
//                            return sb.toString();
//                        }
//                    } catch (IllegalAccessException e) {
//                       log.error("获取属性值异常",e);
//                       return "请检查传递的源对象";
//                    }
//                }
//            }
//        }
//        // 通过效验
//        return null;
//    }

    public static String checkObjNull(Object sourceObject, List<String> checkFields){
        if(Objects.isNull(sourceObject)){
            return "请输入正确源对象";
        }
        if(CollectionUtils.isEmpty(checkFields)){
            return "效验字段不能为空";
        }
        Class<?> objClass = sourceObject.getClass();
        // 获得本类所有属性对象
        Field[] declaredFields = objClass.getDeclaredFields();
        if(null == declaredFields || declaredFields.length == 0){
            return "源对象中没有属性";
        }

        StringBuilder sb = new StringBuilder();
        for (String checkField : checkFields) {
            for (Field field : declaredFields) {
                //关闭程序的安全检测
                field.setAccessible(true);
                // 效验字段与 属性名称相等 则进行效验
                String fieldName = field.getName();
                // 获得指定注解
                ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class);
                // 获得 value属性 的值
                String value = apiModelProperty.value();
                if(checkField.equals(fieldName)){
                    try {
                        // 获得字段属性值
                        Object fieldValue = field.get(sourceObject);
                        // 如果字段属性值为 null 或者 “” 字符串 则认为该字段没有传值
                        if(Objects.isNull(fieldValue) || StringUtils.isEmpty(fieldValue.toString())){
                            sb = sb.append("[").
                                    append(value).
                                    append("]").
                                    append("为必传字段");
                            return sb.toString();
                        }
                    } catch (IllegalAccessException e) {
                        log.error("获取属性值异常",e);
                        return "请检查传递的源对象";
                    }
                }
            }
        }
        // 通过效验
        return null;
    }
    /**
     *
     * @param sourceObject 源对象
     * @param checkFields 需要效验的字段集合
     * @param listPropertyName 源对象的属性名称
     * @return
     */
    public static String checkArrayNull(Object sourceObject, List<String> checkFields,String listPropertyName){
        if(Objects.isNull(sourceObject)){
            return "请输入正确源对象";
        }
        if(CollectionUtils.isEmpty(checkFields)){
            return "效验字段不能为空";
        }
        if(sourceObject instanceof List){
          List list = (List) sourceObject;
            if(CollectionUtils.isEmpty(list)){
                return listPropertyName + "为必传字段";
            }
            for (Object obj : list) {
                String resultStr = checkObjNull(obj, checkFields);
                return resultStr;
            }
        }
        return null;
    }
}
